AWS BatchがジョブレベルでEFSボリュームをサポートするようになっていました
こんにちは。AWS事業本部のKyoです。
AWS BatchがジョブレベルでEFSボリュームをサポートするようになっていました。
BatchでEFSを使うためには一手間が必要だったのでより簡単に使えるようになったというアップデートです。
AWS Batch now supports EFS volumes at the job level
これまでとこれから、そして何がうれしいのか
これまで
EFS自体の利用は可能でした。一方で、マウントには起動テンプレートが必要でバッチインスタンス(EC2)レベルでのマウントが必要でした。具体的な方法は以下にあります。
これから
ジョブ定義からEFSを指定することでマウントできるようになりました。マウントのための起動テンプレートは不要になります。
何がうれしいのか
Batchのストレージに何を使うかは、扱うデータのサイズや求められる計算スピードなどを踏まえての検討が必要となるため、ケースバイケースと考えていますが、マウントの手間が減ったことでEFSを使うハードルが下がった、というのは単純に喜んでいいと思います。
また、Fargate起動タイプからEFSが利用できるようになった というのもポイントです。
Fargate起動タイプはEC2起動タイプと異なりストレージサイズの変更ができません。(Fargateプラットフォームバージョン1.4.0
以降であれば20GBのエフェメラルストレージが割当)。
また、Fargate起動タイプは利用できるCPUとメモリの組み合わせが決まっており、重たい計算というよりは比較的軽量な計算を並列で行う場合などに利用されるケースが多いと考えられます。そうなると複数のジョブから共有ストレージを参照できる今回のアップデートはメリットが大きいのではないでしょうか。
制約
いくつか制約がありますので簡単にまとめます。詳しくはこちらのドキュメントをご覧ください。
EC2起動タイプ
- ECS optimized AMI version
20200319
or later を推奨20200319
with container agent version1.38.0
がGAの対象20191212
with container agent version1.35.0
は現時点でパブリックプレビュー
Fargate起動タイプ
- プラットフォームバージョン
1.4.0
以降が必要 - EFS管理用のスーパーバイザーコンテナが作成され、これによってジョブのメモリが少量使用される
やってみる
個人的によく利用するEC2起動タイプ(スポット)でやってみます。
要素が多いのですが、重要なのは以下の3点です。 1. セキュリティグループ: コンテナインスタンスからEFSのアクセス許可 2. ジョブロール: EFSへアクセスするためのロール 3. ジョブ定義: ボリュームとマウントポイントの指定
セキュリティグループ
以下の2種類のセキュリティグループを準備します。
batch-instance-sg
- Batchインスタンス(Batchコンピューティング環境)に付与
- インバウンドなし
efs-sg
- EFSに付与するsg
batch-instance-sg
からのNFSアクセスを許可
IAM
Batchのジョブ定義様に以下の2種類のIAMロールを作成します。
batch-efs-job-role
- ジョブロールとして使用
- 信頼関係に
ecs-tasks.amazonaws.com
- AWS管理ポリシーの
AmazonElasticFileSystemFullAccess
を付与
- 信頼関係に
- ジョブロールとして使用
batch-exe-role
- 実行ロールとして使用
- 信頼関係に
ecs-tasks.amazonaws.com
- AWS管理ポリシーの
AmazonECSTaskExecutionRolePolicy
を付与
- 信頼関係に
- 実行ロールとして使用
余談ですが、この2つを間違えてハマってしまった経験がある方も多いのではないでしょうか。
この部分はECSと共通なので、以下のエントリのタスクをジョブと読み替えるとすっきりすると思います。
EFS
Batchコンピューティング環境と同じVPC内に作成し、先ほど作成したefs-sg
を付与してください。また、後で必要になるのでファイルシステムID(fs-xxxxx
)をメモしておいてください。
Batch コンピューティング環境
スポットインスタンスを利用する設定にしています。矢印で示した箇所にセキュリティグループとしてbatch-instance-sg
を指定しています。
Batch ジョブキュー
任意の名前でジョブキューを作成し、先ほど作成したコンピューティング環境を紐付けてください。
特に設定値の変更は行っていません。
Batch ジョブ定義
ジョブ定義を作成します。
コンテナにAmazon EFSファイルシステムボリュームを使用するには、ジョブ定義でボリュームとマウントポイント設定を指定する必要があります。
図中の赤枠の4箇所がポイントになります。
- EFSのマウントを確認するため、コマンドを
df -h
- ジョブロールと実行ロール
- ジョブロールに
batch-efs-job-role
- 実行ロールに
batch-exe-role
- ジョブロールに
- マウントポイントの指定
- ボリュームの指定
- ファイルシステムIDはメモしておいたものを入力
エラーが出たら
作成ボタンを押下した際に以下のエラーが発生することがあるようです。
エラー: Error executing request, Exception : When the volume parameter is specified, only one volume configuration type should be used., RequestId: xxxxx
対応として、「プラットフォームで一度Fargateを選択して、再度EC2を選択する」とエラーが発生しなくなりました。原因は不明ですが、Batchが内部的に扱っているパラメータの変更に起因するのではないかと考えています。
Batch ジョブ実行
ジョブを実行します。任意の名前をつけることと、先ほど作成したキューを指定する以外、パラメータの変更は行っていません。
SUCCEEDED
になったログを覗いてみます。
/mnt/efs
にEFSが確認できていますね。
おわりに
本エントリではBatchのジョブ定義から簡単にEFSがマウントできるようになった、というアップデートを紹介しました。
以上、何かのお役に立てれば幸いです。